/*
 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */
package java.util.function;

import java.util.Objects;

/**
 * 表示接受一个整数参数并返回整数结果的函数式接口
 * 用于定义可以对单个整数操作的函数
 */
@FunctionalInterface
public interface IntUnaryOperator {

    /**
     * 对给定的整数参数应用此操作
     * @param operand 整数参数
     * @return 操作后的整数结果
     */
    int applyAsInt(int operand);

    /**
     * 将另一个IntUnaryOperator与当前操作符组合
     * 组合后的操作符会先执行参数中的操作符，然后将结果传递给当前操作符
     *
     * @param before 参数中的操作符，会在当前操作符之前执行
     * @return 组合后的操作符
     */
    default IntUnaryOperator compose(IntUnaryOperator before) {
        Objects.requireNonNull(before);
        return (int v) -> applyAsInt(before.applyAsInt(v));
    }

    /**
     * 将当前操作符与另一个IntUnaryOperator组合
     * 组合后的操作符会先执行当前操作符，然后将结果传递给参数中的操作符
     *
     * @param after 参数中的操作符，会在当前操作符之后执行
     * @return 组合后的操作符
     */
    default IntUnaryOperator andThen(IntUnaryOperator after) {
        Objects.requireNonNull(after);
        return (int t) -> after.applyAsInt(applyAsInt(t));
    }

    /**
     * 返回一个恒等操作符，该操作符返回提供给它的参数
     * 这是一个静态工厂方法，用于创建一个不做任何操作的IntUnaryOperator实例
     *
     * @return 恒等操作符实例
     */
    static IntUnaryOperator identity() {
        return t -> t;
    }
}
